package com.rustic.server.service;

import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.enums.UserWeixinType;
import com.rustic.server.po.UserWeixin;
import me.chanjar.weixin.common.bean.WxOAuth2UserInfo;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 表[user_weixin]对应的服务类
 *
 * @author auto
 */

public interface UserWeixinService extends IService<UserWeixin> {

    String USER_WEIXIN_NOT_EXIST = "用户微信信息不存在";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 用户微信信息列表
     */
    List<UserWeixin> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 用户微信信息列表
     */
    Map<Integer, UserWeixin> mapByIdIn(List<Integer> idList);

    /**
     * 根据UserId获取用户微信信息
     *
     * @param userId UserId
     * @return UserWeixin 用户微信信息
     */
    UserWeixin getByUserId(int userId);

    /**
     * getByUnionId
     *
     * @param unionId unionId
     * @return UserWeixin
     */
    UserWeixin getByUnionId(String unionId);

    /**
     * getByOpenId
     *
     * @param appId  appId
     * @param openId openId
     * @return UserWeixin
     */
    UserWeixin getByOpenId(String appId, String openId);

    /**
     * 新增
     *
     * @param userId  userId
     * @param type    类型
     * @param unionId unionId
     * @param openid  openid
     * @param appId   appId
     */
    void add(Integer userId, UserWeixinType type, String unionId, String openid, String appId);

    /**
     * 新增用户
     *
     * @param userId       userId
     * @param appId        appId
     * @param wxMaUserInfo wxMaUserInfo
     * @param openId
     */
    @Transactional(rollbackFor = Exception.class)
    void tryAdd(int userId, String appId, WxMaUserInfo wxMaUserInfo, String openId);

    /**
     * 新增用户
     *
     * @param userId           userId
     * @param appId            appId
     * @param wxOauth2UserInfo wxOauth2UserInfo
     */
    @Transactional(rollbackFor = Exception.class)
    void tryAdd(Integer userId, String appId, WxOAuth2UserInfo wxOauth2UserInfo);
}
